package com.woniuxy.movie.order.util;

import io.jsonwebtoken.lang.Collections;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    private RedisTemplate<String,Object> redisObjectTemplate;

    /**
     * 读取数据
     */
    public String get(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 写入数据
     */
    public void set(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }
    /**
     * 写入数据并设置有效时间
     */
    public void set(String key, String value,long seconds) {
        stringRedisTemplate.opsForValue().set(key, value,seconds, TimeUnit.SECONDS);
    }
    /**
     * 删除数据
     */
    public void delete(String ...keys) {
        stringRedisTemplate.delete(Collections.arrayToList(keys));
    }
    /*
    * 判断key是否存在
    * */
    public boolean hasKey(String key){
        return stringRedisTemplate.hasKey(key);
    }

    /**
     * Key自增1
     */
    public void incr(String key){
        stringRedisTemplate.opsForValue().increment(key);
    }

    /*
    * 向ZSET中新增一条数据
    * */
    public void zadd(String key,String value,double score){
        stringRedisTemplate.opsForZSet().add(key,value,score);
    }

    /*
    * 使ZSET中某数据的排序值自增
    * */
    public void zincrby(String key,String value,double score){
        stringRedisTemplate.opsForZSet().incrementScore(key,value,score);
    }

    /*
    * 查询一个值在ZSET中的排序值
    * */
    public Double zscore(String key,String value){
        return stringRedisTemplate.opsForZSet().score(key,value);
    }

    /*
    * 删除ZSET中的一个数据
    * */
    public void zrem(String key,String value){
        stringRedisTemplate.opsForZSet().remove(key,value);
    }

    /*
    * 查询ZSET中的数据个数
    * */
    public Long zsize(String key){
        return stringRedisTemplate.opsForZSet().size(key);
    }

    /*
    * 根据排序值的顺序倒序查询某一段数据
    * */
    public Set<String> revrange(String key,Integer pageNum,Integer pageSize){
        return stringRedisTemplate.opsForZSet().reverseRange(key,(pageNum-1)*pageSize,pageNum*pageSize-1);
    }

    /*
    *  保存一个对象
    * */
    public void saveObject(String key,Object object){
        redisObjectTemplate.opsForValue().set(key,object);
    }

    /*
    * 保存一个限时对象
    * */
    public void saveObject(String key,Object object,long seconds){
        redisObjectTemplate.opsForValue().set(key,object,seconds,TimeUnit.SECONDS);
    }
    /*
    * 查询出一个对象
    * */
    public Object getObject(String key){
        return redisObjectTemplate.opsForValue().get(key);
    }

    public void delObject(String key){
        redisObjectTemplate.delete(key);
    }
    /*
    * 新增一条hash数据
    * */
    public void hmset(String key, Map<Object,Object> map){
        stringRedisTemplate.opsForHash().putAll(key,map);
    }

    /*
    * 使Hash中的数据自增
    * */
    public void hincrby(String key,String hashKey,double number){
        stringRedisTemplate.opsForHash().increment(key,hashKey,number);
    }

    /*
    * 更新hash中的数据
    * */
    public void hput(String key,String hashKey,String checked){
        stringRedisTemplate.opsForHash().put(key,hashKey,checked);
    }

    /*
     * 新增一个hash数据
     * */
    public void hset(String key, String hashKey,Object value){
        stringRedisTemplate.opsForHash().put(key,hashKey,value);
    }

    /*
    * 取出hash中的一个属性值
    * */
    public Object hget(String key,String hashKey){
        return stringRedisTemplate.opsForHash().get(key,hashKey);
    }

    /*
    * 取出一个hash中的所有数据
    * */
    public Map<Object,Object> hgetall(String key){
        return stringRedisTemplate.opsForHash().entries(key);
    }


}
